<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>

        //方式一：字面量对象
        let user={
            name:"tom",
            age:23
        };

        //方式二：构造函数
        function Stu(name,age){
            this.name=name;
            this.age=age;
        }

        // 原型方法是js为构造器(构造函数)提供特殊方法定义区域，用于为基于该构造函数创建的实例对象提供统一的方法模板
        Stu.prototype.say=function(){
            // console.log(this);//原型方法内部的this指向于构造器创建出来的对应的实例对象
            console.log(`my name is ${this.name}`);
        };

        let stu1=new Stu("jack",21);
        let stu2=new Stu("cici",34);
        console.log(stu1);
        stu1.say();
        stu2.say();

        // 方式三：Object.create()静态功能方法创建js对象
        // Object.create(prototype, descriptors)
        //  创建一个新的对象，使用其他对象的原型创建对象
        //  prototype提供构建对象时候的原型参考：
        //      取值：
        //          可以是一个实例对象，新构建的对象会以该实例对象作为模板，同时获取该实例对象的所有属性
        //          可以是一个固定的原型，新创建的对象会以该原型作为模板
        //          取值是null，创建一个没有原型的特殊对象
        //  descriptors对创建的对象进行属性设置描述
        let obj=Object.create(null);
        console.log(obj);

        // ES6通过新增关键字class,将程序开发模式推进到OOP编程模式(面向对象开发)
        // 方式四：class对象构造器创建 ，语法: class 构造器名称{构造体}

        class Book{
            // 在class构造体内，通过constructor关键函数，替换原始的构造方法
            constructor(bookName,author){
                this.bookName=bookName;//constructor内部的this指向于当前class被创建时候返回实例对象
                this.author=author;
            }
            //在class构造体内，定义普通的方法就是原型方法
            printInfo(){
                console.log("this is "+this.bookName);
            }
        }
        let book=new Book("es6入门手册","itany");
        let book2=new Book("es6入门手册2","itany2");
        book.printInfo();
        book2.printInfo();


    </script>
</head>
<body>
    
</body>
</html>